Application Load Balancerを経由してAmazon EC2上のWebページにアクセスする設定をまとめてみた
Application Load Balancer経由でApache HTTP Serverのページにアクセスしたい
おのやんです。
みなさん、Application Load Balancer(以下、ALB)から、Apache HTTP Server(以下、Apache)上のWebページにアクセスしたいと思ったことはありませんか?私はあります。
AWS上でWebサーバーを構築する際のパターンとして、EC2インスタンス上でWebサーバーをホスティングする方法があります。この際、一般的にはEC2をパブリックに晒すのではなく、プライベートサブネットにEC2インスタンスを配置した上で、インターネットとEC2インスタンスの間にALBを配置する構成を取ることが多いです。この際、ApacheのWebサーバーから見られるWebページを、ALBから閲覧できるか確認する機会がありました。
ということで、今回はEC2インスタンス、ALB、Apacheを設定して、Webページにアクセスしてみようと思います。
AWS構成
今回は、マルチAZのサブネットに配置した2台のEC2インスタンスにそれぞれApacheをインストールします、それぞれのインスタンスに2種類のページを用意して、パスパターンによるルーティングを行います。
この構成をこちらに示します。VPCやSSM用のエンドポイント(参考ブログ)など、ネットワーク関連のリソースはあらかじめ構築してあるものとして進めていきます。
セキュリティグループの作成
まずは、セキュリティグループを作成します。これらは先ほどの構成図では省略していましたが、EC2インスタンスとALBにアタッチするセキュリティグループになります。
例として、ALB用のセキュリティグループをマネジメントコンソール上で作成します。セキュリティグループ名はaws-test-alb-sg
で、インバウンドルールにインターネットから80番ポートへのTCP通信(HTTP通信)を許可します。また、VPCは既存のものを使用します。
同様にEC2用のセキュリティグループも作成します。こちらの名前はaws-test-ec2-sg
とし、インバウンドルールにALB用セキュリティグループ(aws-test-alb-sg
)から80番ポートへのTCP通信(HTTP通信)を許可します。
こちらのセキュリティグループは、両方のEC2インスタンスで使用しますので、作成するのは1個で問題ありません。
セキュリティグループ上で表示名を整えて、こちらのように2つのセキュリティグループが作成できたら完了です。
IAMロールの作成
次に、EC2インスタンスプロファイルとして設定するIAMロールを作成します。具体的には、EC2インスタンスに対してSSM経由で接続できるよう許可します。
IAMロール作成画面では、最初に信頼するエンティティを選択します。今回はEC2インスタンスプロファイルとして設定するため、EC2を選択します。
今回追加するIAMポリシーはAmazonSSMManagedInstanceCore
です。
今回作成するIAMロールの名前はaws-test-ec2-role
に設定しておきます。
このようにIAMロールを作成できたら完了です。
EC2インスタンスの作成
次にEC2インスタンスを2台作成します。1つ目に作成するEC2インスタンスはaws-test-primary-ec2
という名前にしておきます。また、OSはAmazon Linux 2023にしておきましょう。
今回は検証用途ということで、インスタンスタイプはt2.micro
に設定しておきます。またSSM経由で接続するため、キーペアはなしで大丈夫です。セキュリティグループは、先ほど作成したaws-test-ec2-sg
を選択しておきます。こちらの画面では自動で設定されていましたが、サブネットはap-northeast-1a
のプライベートサブネットを選択しておきます。
IANインスタンスプロファイルに関しては、高度な詳細の項目より設定できます。これらの設定が完了したら、EC2インスタンスを作成します。
2つ目に作成するEC2インスタンスは基本的にスペックは同じです。名前はaws-test-secondary-ec2
に、サブネットはap-northeast-1c
のプライベートサブネットを選択しておきましょう。
Apacheの設定
次に、それぞれのインスタンスでApacheを設定します。まずはEC2インスタンスに対してSSMなどを経由して接続します。このEC2インスタンス内で、以下のコマンドを実行してApacheをインストール・起動します。
$ sudo yum update -y $ sudo yum install -y httpd $ sudo systemctl start httpd
こちらが完了したら、ローカルホストにリクエストを送信して、Webサーバーが起動していることを確認します。curl
コマンドをこのように実行して、Apacheのデフォルトページが返ってくれば、正常にWebサーバーが起動していることが確認できます。
$ curl http://localhost <html><body><h1>It works!</h1></body></html>
ここからは、2つのEC2インスタンスでそれぞれ異なる設定を行います。
aws-test-primary-ec2
の方では、Apacheのドキュメントルートである/var/www/html
の直下に/primary/index.html
を作成します。
$ sudo mkdir /var/www/html/primary/ $ sudo touch /var/www/html/primary/index.html
/var/www/html/primary/index.html
には、簡単なHTMLを記述しておきましょう。
<h1>About</h1> This is a primary page!
こちらのパスにリクエストを送って、先ほど設定したHTMLのレスポンスが返ってくればOKです。
$ curl http://localhost/primary/index.html <h1>About</h1> This is a primary page!
aws-test-secondary-ec2
の方では、Apacheのドキュメントルートである/var/www/html
の直下に/secondary/index.html
を作成します。
$ sudo mkdir /var/www/html/secondary/ $ sudo touch /var/www/html/secondary/index.html
/var/www/html/secondary/index.html
にも、簡単なHTMLを記述しておきましょう。
<h1>About</h1> This is a secondary page!
こちらのパスにリクエストを送って、先ほど設定したHTMLのレスポンスが返ってくればOKです。
$ curl http://localhost/secondary/index.html <h1>About</h1> This is a secondary page!
ターゲットグループの作成
ALBを設定するためにはターゲットグループが必要ですので、こちらを作成します。作成するターゲットグループは、aws-test-primary-tg
とaws-test-secondary-tg
の2つです。
まずはaws-test-primary-tg
を作成します。ターゲットタイプはインスタンス、プロトコルとポートはそれぞれHTTPと80を設定しておきます。
IPアドレスはデフォルトのIPv4、VPCは既存のものを選択しておきます。またプロトコルのバージョンはHTTP1を設定します。
今回はApacheのドキュメントルート直下の/primary/index.html
にアクセスしたいので、ヘルスチェックでもこちらの値を設定します。
ALBはターゲットグループ単位でルーティングを行うため、ターゲットとしてaws-test-primary-ec2
のみを選択しましょう。
「保留中として以下を含める」ボタンを押下したら、下のターゲット確認画面にaws-test-primary-ec2
が表示されますので、こちらを確認したのちターゲットグループを作成します。
同様にaws-test-secondary-t
gも作成して、こちらの手順は完了です。
ALBの作成
ターゲットグループの作成が完了しましたので、続いてALBも作成していきます。ALBの名前は、今回はaws-test-alb
で設定します。またスキームはインターネット向け、IPアドレスタイプはターゲットグループ同様IPv4に設定しておきます。
ALBを設置するVPCは既存のものを選択し、サブネットはそれぞれのAZのパブリックサブネットを選択しておきます。
セキュリティグループは、先ほど作成したaws-test-alb-sg
を選択します。
リスナーとルーティングに関しては後から変更しますので、いったんHTTP:80のリスナーに対するデフォルトアクションとして、aws-test-primary-tg
を選択しておきます。これらを設定したら、ALBを作成します。
次に、ALB詳細画面の「リスナーとルール」タブを選択します。ここの「HTTP:80」を押下して、リスナールール詳細画面に移動します。
このリスナールールのうち「デフォルト」のルールを選択し、「ルールの編集」を選択します。
ここで、先ほど設定したデフォルトアクションを変更します。アクションのルーティングに関しては固定レスポンスを指定し、コードは404、コンテンツタイプはtest/plain、レスポンス本文として"Not found..."と設定しておきましょう。これらを設定できたら、変更内容を保存します。
このようにデフォルトアクションを変更できたら、次にaws-test-primary-tg
、aws-test-secondary-tg
にルーティングするルールを追加します。リスナールールの画面から「ルールを追加する」を押下します。
リスナールールに設定する条件として、今回は「パス」を選択します。Apacheで作成したディレクトリ・ファイルに合わせて、今回は/primary
と/primary/*
のパターンを設定します。
ターゲットグループはaws-test-primary-tg
を選択しておきます。
今回は優先度は1にしておきましょう。これらの設定が完了したら、リスナールールを作成します。
同様に、/secondaryと/secondary/*のパスに対してaws-test-secondary-tg
にルーティングするリスナールールも追加しておきます。
接続確認
以上の作業が終われば、Apacheのページに接続できるはずです。こちらのALBのDNS名をブラウザに打ち込んでみましょう。
最初にアクセスした場合、/primary
や/secondary
のパスのどれにも一致していないので、ALBの固定レスポンスが帰ってきます。
/primary/index.html
に接続すると、aws-test-primary-ec2
で設定したページが表示されます。
同様に、/secondary/index.html
に接続すると、aws-test-secondary-ec2
で設定したページが表示されます。
存在しないパスにアクセスすると、こちらもパスのパターンに一致しないため、固定レスポンスが返されます。
ALBを経由してWebページにアクセスできた
EC2やALBなどのリソースを作成して、EC2上のWebページにアクセスしてみました。またALBでルーティングの設定を行い、パスによって表示されるページを変えてみました。
EC2上でWebサーバーをホスティングするなどで、こちらの記事が参考になれば幸いです。では!